package course.p6_queue;

/**
 * 队列的数组实现
 * 队列则使用链表结构更加合适，先进先出的特性更加符合链表的特性
 * 如果使用数组实现，则需要额外关注索引的计算
 * 如下所示就是的哈哈哈
 */
public class ArrayQueue {


    /**
     * 记录队列头部元素索引
     */
    private int front;

    /**
     * 记录队列尾元素索引
     */
    private int rear;

    /**
     * 记录队列空间大小
     */
    private int capacity = 10;

    /**
     * 存储队列数据
     */
    private int[] array;

    public ArrayQueue(){
        front = -1;
        rear = -1;
        array = new int[capacity];
    }

    //有参构造方法
    public ArrayQueue(int size){
        capacity = size;
        front = -1;
        rear = -1;
        array = new int[size];
    }

    //创建一个大小为size的队列的静态方法
    public static ArrayQueue createQueue(int size){
        return new ArrayQueue(size);
    }

    //判断队列是否为空
    public boolean isEmpty(){
        return front==-1;
    }

    //判断队列是否满了
    public boolean isFull(){
        return ((rear+1)%capacity == front);//如果队列满了，则头部索引为0且尾部索引为capacity-1
    }

    //得到队列的大小
    public int getQueueSize(){
        return ((capacity-front+rear+1)%capacity);
    }

    //向队列添加值
    public void offer(int data) {
        if(isFull()){
            System.out.println("Queue Overflow");
        }else {
            rear = (rear+1)%capacity;
            array[rear] = data;
            if(front == -1)
                front = rear;//首次添加元素时首尾索引相等
        }
    }

    //弹出当前队列最先进入的值
    public int poll() {
        int data=0;
        if(isEmpty()){
            System.out.println("Queue Empty");
        } else {
            data = array[front];
            // 如果只剩一个元素,
            if(front == rear) {
                front = -1;
                rear = -1;
            }else {
                front = (front+1)%capacity;
            }
        }
        return data;
    }
}
